package com.zjpavt.client.extenddevice.networkdevice;

import com.zjpavt.client.hal.network.NetworkManager;
import com.zjpavt.client.udp.UdpSender;

import java.util.ArrayList;
import java.util.List;

/**
 * 501网络同步协议
 * @author zyc
 */
public class UnknownDevcie501 {
    public static final byte NULL_BYTE= 0x00;
    public static final byte FILE_CHOOSE_BYTE = 0x10;
    public static final byte SPEED_SET_BYTE = 0x20;
    public static final byte STOP_CONTINUE_BYTE = 0x30;
    public static final byte BRIGHTNESS_BYTE = 0x40;
//    public static final String DESTINATION_IP = NetworkManager.getInstance().getBroadcastAddress(NetworkManager.INTERFACE_ETH_0);;
    public static final int DESTINATION_PORT = 60000;

    private String getBroadcast() {
        return NetworkManager.getInstance().getBroadcastAddress(NetworkManager.INTERFACE_ETH_0);
    }
    public static void main(String[] args) {
        UnknownDevcie501 unknownDevcie501 = new UnknownDevcie501();
        unknownDevcie501.setBrightness(10);
        unknownDevcie501.chooseFile2Play();
        unknownDevcie501.setPlaySpeed(60);
        unknownDevcie501.stopPlay();
        unknownDevcie501.continuePlay();
        SunLiteDevice.sendSuiteScene(12);
    }
    private List<Byte> fileChoosedList = new ArrayList<>();

    private void sendMessage(byte[] message) {
        UdpSender.sendUdpPacket(getBroadcast(), DESTINATION_PORT, message);
    }

    private void sendMessage(List<Byte> commandList) {
        byte[] commandArrays = new byte[20];
        for (int i = 0; i < commandList.size(); i++) {
            commandArrays[i] = commandList.get(i);
        }
        UdpSender.sendUdpPacket(getBroadcast(), DESTINATION_PORT, commandArrays);
    }
    /**
     * 第1字节--x10 选择播放的文件；
     * 第2,3,4,5字节--保留
     * 第6~20字节--这15个字节代表SD卡中十五个要循环播放的文件序号(文件序号0表示第一个文件、1表示第二个文件，以此类推），0xFF代表无效文件。
     * 例如：要播放SD卡里第一个文件：0x10+[4个0x00]+0x00+[14个0xff]
     *       要循环播放SD卡里第三、六、九个文件：0x10+[4个0x00]+0x02+0x05+0x08+[12个0xff]
     */
    private void chooseFile2Play() {
        List<Byte> commandList = new ArrayList<>(20);
        commandList.add(FILE_CHOOSE_BYTE);
        for (int i = 0; i < 4; i++) {
            commandList.add(NULL_BYTE);
        }
        int chooseFileNum = fileChoosedList.size();
        for (int i = 0; i < 15; i++) {
            if (i < chooseFileNum) {
                commandList.add(fileChoosedList.get(i));
            } else {
                commandList.add(NULL_BYTE);
            }
        }
        sendMessage(commandList);
    }

    public static final int MIN_SPEED = 0;
    public static final int MAX_SPEED = 50;
    /**
     * 第1字节--x11 选择播放速度；
     * 第2字节--播放速度（0~50），为0时停止，1时1帧/秒，2时2帧/秒...以此类推；
     * 第3~20字节--保留。
     * 例如：设置播放速度为5：0x11+0x05+[18个0x00]
     */
    private void setPlaySpeed(int speed) {
        if (speed < MIN_SPEED) {
            speed = MIN_SPEED;
        }
        if (speed > MAX_SPEED) {
            speed = MAX_SPEED;
        }
        List<Byte> commandList = new ArrayList<>(20);
        commandList.add(SPEED_SET_BYTE);
        commandList.add((byte) speed);

        for (int i = 0; i < 18; i++) {
            commandList.add(NULL_BYTE);
        }
        sendMessage(commandList);
    }

    public static final byte STOP_BYTE = 0x00;
    public static final byte CONTINUE_BYTE = 0x01;

    /**
     * 暂停播放
     */
    private void stopPlay() {
        stopOrContinue(STOP_BYTE);
    }
    /**
     * 开始播放
     */
    private void continuePlay() {
        stopOrContinue(CONTINUE_BYTE);
    }

    /**
     *      *     第1字节--x12 暂停/继续播放；
     *      *     第2字节--0：暂停播放；1：继续播放
     *      *     第3~20字节--保留。
     *      *     例如：设置暂停：0x12+0x00+[18个0x00]
     * @param continueByte
     *
     *
     */
    private void stopOrContinue(byte continueByte) {
        List<Byte> commandList = new ArrayList<>(20);
        commandList.add(STOP_CONTINUE_BYTE);
        commandList.add(continueByte);
        for (int i = 0; i < 18; i++) {
            commandList.add(NULL_BYTE);
        }
        sendMessage(commandList);
    }

    public static final int MIN_BRIGHTNESS = 0;
    public static final int MAX_BRIGHTNESS = 100;
    /**
     *     第1字节--x13 调亮度；
     *     第2字节--亮度0~100，0灯灭，100灯最亮；
     *     第3~20字节--保留。
     *     例如：设置亮度为50%：0x13+0x32+[18个0x00]
     */
    private void setBrightness(int brightness) {
        if (brightness < MIN_BRIGHTNESS) {
            brightness = MIN_BRIGHTNESS;
        }
        if (brightness > MAX_BRIGHTNESS) {
            brightness = MAX_BRIGHTNESS;
        }
        List<Byte> commandList = new ArrayList<>(20);
        commandList.add(BRIGHTNESS_BYTE);
        commandList.add((byte)brightness);
        for (int i = 0; i < 18; i++) {
            commandList.add(NULL_BYTE);
        }
        sendMessage(commandList);
    }
}
